Project Objective

Stock Portfolio Management System

The objective is to create a stock portfolio management system that allows users to manage their investments effectively. The system will provide the following features: *Portfolio Management: Users can add stocks, update, or remove them from their portfolio, including information like stock symbol plus company name , purchase date, purchase price, and quantity. Users can make separate portfolios.

*Real-Time Stock Prices: The system will retrieve real-time stock prices using financial APIs (e.g., Alpha Vantage or Yahoo Finance). Hence, users can view the current value of their portfolio based on the latest stock prices.

*Performance Metrics: The system will calculate key portfolio performance metrics, including total portfolio value, total gain/loss, percentage gain/loss, etc.

*Visualization: Users can visualize their portfolio's performance and check historical performance trends using interactive charts (e.g., line charts or pie charts).

Dataset Details For real-time stock prices and historical data, the system will utilize financial APIs to fetch stock information. We'll rely on live data from these APIs.

In [2]:
import pandas as pd
import numpy as np
import requests
In [6]:
import yfinance as yf  # Import Yahoo Finance API for real-time stock prices
import plotly.graph_objs as go
import plotly.express as px
from datetime import datetime
from matplotlib import pyplot as plt
In [7]:
# Define Stock object with attributes
class Stock:
    def __init__(self, symbol, company_name, purchase_date, purchase_price, quantity):
        self.symbol = symbol
        self.company_name = company_name
        self.purchase_date = purchase_date
        self.purchase_price = purchase_price
        self.quantity = quantity

# Define Portfolio object with attributes and methods
class Portfolio:
    def __init__(self, name):
        self.name = name
        self.stocks = []

    # Define Add Stock Method
    def add_stock(self, stock):
        # Ensure consistent date formatting
        try:
            stock.purchase_date = datetime.strptime(stock.purchase_date, '%Y-%m-%d').date()
        except ValueError:
            print("Invalid date format. Please use 'YYYY-MM-DD' format.")
        return self.stocks.append(stock)

    # Define Remove Stock Method
    def remove_stock(self, symbol):
        self.stocks = [s for s in self.stocks if s.symbol != symbol]

    # Define Get Current Stock Price Method
    def get_current_stock_price(self, symbol):
        # fetch real-time stock prices using Yahoo Finance API
        stock = yf.Ticker(symbol)
        current_price = stock.history(period="1d")["Close"].iloc[0]
        return current_price

    # Define Calculate Total Purchase Value Method
    def calculate_total_purchase_value(self):
        total_purchase_value = sum(stock.purchase_price * stock.quantity for stock in self.stocks)
        return total_purchase_value

    # Define Calculate Stock Gain Loss Method
    def calculate_stock_gain_loss(self, stock):
        current_price = self.get_current_stock_price(stock.symbol)
        if current_price is not None:
            purchase_value = stock.purchase_price * stock.quantity
            current_value = current_price * stock.quantity
            return current_value - purchase_value
        return None  # Default to None if current price cannot be fetched

    # Define Calculate Total Gain/Loss Method
    def calculate_total_gain_loss(self):
        total_gain_loss = 0
        for stock in self.stocks:
            gain_loss = self.calculate_stock_gain_loss(stock)
            total_gain_loss += gain_loss
        return total_gain_loss

    # Define Calculate Total Percentage Gain/Loss Method
    def calculate_percentage_gain_loss(self):
        total_gain_loss = self.calculate_total_gain_loss()
        total_purchase_value = self.calculate_total_purchase_value()
        if total_purchase_value != 0:
            return (total_gain_loss / total_purchase_value) * 100
        return None

    # Define Calculate Total Portfolio Current Value Method
    def calculate_portfolio_value(self):
        total_value = 0
        for stock in self.stocks:
            current_price = self.get_current_stock_price(stock.symbol)
            if current_price is not None:
                stock_value = current_price * stock.quantity
                total_value += stock_value
        return total_value

    # Define View Portfolio Details Method
    def view_portfolio(self):
        print(f"Portfolio Name: {self.name}")
        print("Stocks in Portfolio:")
        for stock in self.stocks:
            print(f"\nStock Symbol: {stock.symbol}")
            print(f"Company Name: {stock.company_name}")
            print(f"Purchase Date: {stock.purchase_date}")
            print(f"Purchase Price: ${stock.purchase_price:.2f}")
            current_price = self.get_current_stock_price(stock.symbol)
            print(f"Current Price: {current_price: .2f}")
            print(f"Quantity: {stock.quantity}")
        total_purchase_value = self.calculate_total_purchase_value()
        total_current_value = self.calculate_portfolio_value()
        total_gain_loss = self.calculate_total_gain_loss()
        percentage_gain_loss = self.calculate_percentage_gain_loss()
        print(f"\nTotal Purchase Value: {total_purchase_value}")
        print(f"Total Current Value: ${total_current_value:.2f}")
        print(f"Total Gain/Loss: ${total_gain_loss:.2f}")
        print(f"Percentage Gain/Loss: {percentage_gain_loss:.2f}%")

    # Define Edit Portfolio Name Method
    def edit_portfolio(self, new_name):
        self.name = new_name

    # Define Edit Stock Details Method
    def edit_stock_details(self, stock):
        # Offer options to edit
        while True:
            print("\nEdit Stock Details:")
            print("1. Edit Company Name")
            print("2. Edit Purchase Date")
            print("3. Edit Purchase Price")
            print("4. Edit Quantity")
            print("0. Done Editing")

            choice = input("Select an option to edit stock details (1. Edit Company Name; 2. Edit Purchase Date; 3. Edit Purchase Price; 4. Edit Quantity; 0. Done Editing): ")
            print(f"Option {choice} selected.")

            if choice == '1':
                edit_company_name = input("Enter the new company name: ")
                stock.company_name = edit_company_name
                print("Company name updated.")

            elif choice == '2':
                edit_purchase_date = input("Enter the new purchase date: ")
                stock.purchase_date = edit_purchase_date
                print("Purchase date updated.")

            elif choice == '3':
                edit_purchase_price = input("Enter the new purchase price: ")
                stock.purchase_price = edit_purchase_price
                print("Purchase price updated.")

            elif choice == '4':
                edit_quantity = input("Enter the new quantity: ")
                stock.quantity = edit_quantity
                print("Quantity updated.")

            elif choice == '0':
                print("Done editing stock details.")
                break

            else:
                print("Invalid choice. Please select a valid option.")

    # Define Plot Portfolio Performance for all stocks Method
    def plot_portfolio_performance(self):
        fig = go.Figure()
        for stock in self.stocks:
            # get historical data starting from the purchase date till now
            historical_data = yf.Ticker(stock.symbol).history(start = stock.purchase_date, end = datetime.today().strftime('%Y-%m-%d'))
            # plot the line graph
            fig.add_trace(go.Scatter(x = historical_data.index, y = historical_data["Close"], mode='lines', name=stock.symbol))

        fig.update_layout(
            title=f"{portfolio.name} Portfolio Performance",
            xaxis_title="Date",
            yaxis_title="Closing Price",
            xaxis_rangeslider_visible=True,
            xaxis_type='category'
        )
        fig.show()

    # Define Portfolio Total Value Visualization Over a given period Method
    def visualize_portfolio_total_value_over_time(self, time_scale):
        # Define time intervals (1w, 1mo, 1y)
        if time_scale == '1w':
            period = '1wk'
        elif time_scale == '1mo':
            period = '1mo'
        elif time_scale == '1y':
            period = '1y'
        else:
            raise ValueError("Invalid time scale")

        fig, ax = plt.subplots(figsize=(10, 6))

        # Create a list to store total current values
        total_current_values = []

        for stock in self.stocks:
            # Fetch historical data for the selected time period
            historical_data = yf.Ticker(stock.symbol).history(period=period)

            # Calculate performance metrics for the stock
            dates = historical_data.index
            closing_prices = historical_data['Close']
            current_values = closing_prices * stock.quantity

            # Append current values for each stock
            total_current_values.append(current_values)

        # Calculate the total portfolio value by summing current values for all stocks
        total_current_values = sum(total_current_values)

        # Plot total portfolio current value over time
        ax.plot(dates, total_current_values, label='Total Portfolio - Current Value')

        # Customize the plot
        ax.set_xlabel('Date')
        ax.set_ylabel('Total Portfolio Value')
        ax.set_title(f'Portfolio Total Value Over the Last {time_scale}')
        ax.legend()
        ax.grid(True)

        plt.show()
In [8]:
# If you want to empty entire portfolios and rerun the program
# create a list to store portfolios
# portfolios = []
In [9]:
# Define main program

# Offer options to manage the stock portfolio
while True:
    print("\nWelcome to Stock Portfolio Management System! Please select an option below:")
    print("1. Create Portfolio")
    print("2. Add Stock to Portfolio")
    print("3. Remove Stock from Portfolio")
    print("4. View Portfolio")
    print("5. Calculate Portfolio Value")
    print("6. Edit Portfolio Name")
    print("7. Edit Stock Details")
    print("8. Plot Portfolio Performance")
    print("9. Visualize Total Portfolio Value Over Time")
    print("0. Exit")

    choice = input("Please select an option (1. Create Portfolio; 2. Add Stock to Portfolio; 3. Remove Stock from Portfolio; 4. View Portfolio; 5. Calculate Portfolio Value; 6. Edit Portfolio Name; 7. Edit Stock Details; 8. Plot Portfolio Performance; 9. Visualize Total Portfolio Value Over Time; 0 to exit): ")
    print(f"Option {choice} selected.")

    if choice == '1':
        name = input("Enter the portfolio name you would like to create: ")
        portfolio = Portfolio(name)
        # add the new portfolio name
        portfolios.append(portfolio)
        print(f"Portfolio '{name}' created.")

    elif choice == '2':
        name = input("Enter the portfolio name to add stock: ")
        # check the existing portfolio name
        portfolio = next((p for p in portfolios if p.name == name), None)
        if portfolio:
            symbol = input("Enter stock symbol to add: ")
            company_name = input("Enter company name: ")
            purchase_date = input("Please use 'YYYY-MM-DD' format. Enter purchase date: ")
            purchase_price = float(input("Enter purchase price: "))
            quantity = int(input("Enter quantity: "))
            stock = Stock(symbol, company_name, purchase_date, purchase_price, quantity)
            # call Add Stock method
            portfolio.add_stock(stock)
            print(f"Stock added to the portfolio '{name}'.")
        else:
            print(f"Portfolio '{name}' not found.")

    elif choice == '3':
        name = input("Enter the portfolio name to remove stock: ")
        # check the existing portfolio name
        portfolio = next((p for p in portfolios if p.name == name), None)
        if portfolio:
            symbol = input("Enter stock symbol to remove: ")
            # check the existing stock symbols
            stock = next((s for s in portfolio.stocks if s.symbol == symbol), None)
            if stock:
                # call Remove Stock method
                portfolio.remove_stock(symbol)
                print(f"Stock '{symbol} removed from the portfolio '{name}'.")
            else:
                print(f"Stock '{symbol}' not found in portfolio '{name}'.")
        else:
            print(f"Portfolio '{name}' not found.")

    elif choice == '4':
        name = input("Enter the portfolio name to view: ")
        # check the existing portfolio name
        portfolio = next((p for p in portfolios if p.name == name), None)
        if portfolio:
            # call Portfolio View method
            portfolio_view = portfolio.view_portfolio()
        else:
            print(f"Portfolio '{name}' not found.")

    elif choice == '5':
        name = input("Enter the portfolio name to get the performance metrics: ")
        # check the existing portfolio name
        portfolio = next((p for p in portfolios if p.name == name), None)
        if portfolio:
            portfolio_current_value = portfolio.calculate_portfolio_value()
            portfolio_purchase_value = portfolio.calculate_total_purchase_value()
            portfolio_gain_loss = portfolio.calculate_total_gain_loss()
            portfolio_percentage_gain_loss = portfolio.calculate_percentage_gain_loss()
            print(f"Total current value of '{name}' portfolio: ${portfolio_current_value:.2f}")
            print(f"Total purchase value of '{name}' portfolio: ${portfolio_purchase_value:.2f}")
            print(f"Total gain/loss of '{name}' portfolio: ${portfolio_gain_loss:.2f}")
            print(f"Total percentage gain/loss of '{name}' portfolio: ${portfolio_percentage_gain_loss:.2f}%")
        else:
            print(f"Portfolio '{name}' not found.")

    elif choice == '6':
        name = input("Enter the portfolio name you want to edit: ")
        # check the existing portfolio name
        portfolio = next((p for p in portfolios if p.name == name), None)
        if portfolio:
            new_name = input("Enter the new portfolio name: ")
            portfolio.edit_portfolio(new_name)
            print(f"Portfolio name updated to '{new_name}'.")
        else:
            print(f"Portfolio '{name}' not found.")

    elif choice == '7':
        name = input("Enter the portfolio name containing the stock you want to edit: ")
        # check the existing portfolio name
        portfolio = next((p for p in portfolios if p.name == name), None)
        if portfolio:
            symbol = input("Enter stock symbol to edit: ")
            # check the existing stock symbols
            stock = next((s for s in portfolio.stocks if s.symbol == symbol), None)
            if stock:
                portfolio.edit_stock_details(stock)
            else:
                print(f"Stock '{symbol}' not found in portfolio '{name}'.")
        else:
            print(f"Portfolio '{name}' not found.")

    elif choice == '8':
        # Plot portfolio performance
        name = input("Enter the portfolio name to plot performance: ")
        # check the existing portfolio name
        portfolio = next((p for p in portfolios if p.name == name), None)
        if portfolio:
            portfolio.plot_portfolio_performance()
        else:
            print(f"Portfolio '{name}' not found.")

    elif choice == '9':
        name = input("Enter the portfolio name to plot performance: ")
        # check the existing portfolio name
        portfolio = next((p for p in portfolios if p.name == name), None)
        if portfolio:
            time_scale = input("Enter the time scale (1w, 1mo, 1y): ")
            # Integrate the visualization
            result = portfolio.visualize_portfolio_total_value_over_time(time_scale)
            if result is not None:
                fig, ax = result
                plt.show()
            else:
                print("The visualization function returned None.")
        else:
            print(f"Portfolio '{name}' not found.")

    elif choice == '0':
        print("Exiting the management program. Thank you!")
        break
    else:
        print("Invalid choice. Please select a valid option.")
Welcome to Stock Portfolio Management System! Please select an option below:
1. Create Portfolio
2. Add Stock to Portfolio
3. Remove Stock from Portfolio
4. View Portfolio
5. Calculate Portfolio Value
6. Edit Portfolio Name
7. Edit Stock Details
8. Plot Portfolio Performance
9. Visualize Total Portfolio Value Over Time
0. Exit
Please select an option (1. Create Portfolio; 2. Add Stock to Portfolio; 3. Remove Stock from Portfolio; 4. View Portfolio; 5. Calculate Portfolio Value; 6. Edit Portfolio Name; 7. Edit Stock Details; 8. Plot Portfolio Performance; 9. Visualize Total Portfolio Value Over Time; 0 to exit): 1
Option 1 selected.
Enter the portfolio name you would like to create: abc
Portfolio 'abc' created.

Welcome to Stock Portfolio Management System! Please select an option below:
1. Create Portfolio
2. Add Stock to Portfolio
3. Remove Stock from Portfolio
4. View Portfolio
5. Calculate Portfolio Value
6. Edit Portfolio Name
7. Edit Stock Details
8. Plot Portfolio Performance
9. Visualize Total Portfolio Value Over Time
0. Exit
Please select an option (1. Create Portfolio; 2. Add Stock to Portfolio; 3. Remove Stock from Portfolio; 4. View Portfolio; 5. Calculate Portfolio Value; 6. Edit Portfolio Name; 7. Edit Stock Details; 8. Plot Portfolio Performance; 9. Visualize Total Portfolio Value Over Time; 0 to exit): 2
Option 2 selected.
Enter the portfolio name to add stock: abc
Enter stock symbol to add: NVDA
Enter company name: Nvidia
Please use 'YYYY-MM-DD' format. Enter purchase date: 2023-09-09
Enter purchase price: 360
Enter quantity: 100
Stock added to the portfolio 'abc'.

Welcome to Stock Portfolio Management System! Please select an option below:
1. Create Portfolio
2. Add Stock to Portfolio
3. Remove Stock from Portfolio
4. View Portfolio
5. Calculate Portfolio Value
6. Edit Portfolio Name
7. Edit Stock Details
8. Plot Portfolio Performance
9. Visualize Total Portfolio Value Over Time
0. Exit
Please select an option (1. Create Portfolio; 2. Add Stock to Portfolio; 3. Remove Stock from Portfolio; 4. View Portfolio; 5. Calculate Portfolio Value; 6. Edit Portfolio Name; 7. Edit Stock Details; 8. Plot Portfolio Performance; 9. Visualize Total Portfolio Value Over Time; 0 to exit): 2
Option 2 selected.
Enter the portfolio name to add stock: abc
Enter stock symbol to add: AAPL
Enter company name: Apple
Please use 'YYYY-MM-DD' format. Enter purchase date: 2023-10-02
Enter purchase price: 180
Enter quantity: 150
Stock added to the portfolio 'abc'.

Welcome to Stock Portfolio Management System! Please select an option below:
1. Create Portfolio
2. Add Stock to Portfolio
3. Remove Stock from Portfolio
4. View Portfolio
5. Calculate Portfolio Value
6. Edit Portfolio Name
7. Edit Stock Details
8. Plot Portfolio Performance
9. Visualize Total Portfolio Value Over Time
0. Exit
Please select an option (1. Create Portfolio; 2. Add Stock to Portfolio; 3. Remove Stock from Portfolio; 4. View Portfolio; 5. Calculate Portfolio Value; 6. Edit Portfolio Name; 7. Edit Stock Details; 8. Plot Portfolio Performance; 9. Visualize Total Portfolio Value Over Time; 0 to exit): 2
Option 2 selected.
Enter the portfolio name to add stock: abc
Enter stock symbol to add: AMZN
Enter company name: Amazon
Please use 'YYYY-MM-DD' format. Enter purchase date: 2023-09-17
Enter purchase price: 240
Enter quantity: 200
Stock added to the portfolio 'abc'.

Welcome to Stock Portfolio Management System! Please select an option below:
1. Create Portfolio
2. Add Stock to Portfolio
3. Remove Stock from Portfolio
4. View Portfolio
5. Calculate Portfolio Value
6. Edit Portfolio Name
7. Edit Stock Details
8. Plot Portfolio Performance
9. Visualize Total Portfolio Value Over Time
0. Exit
Please select an option (1. Create Portfolio; 2. Add Stock to Portfolio; 3. Remove Stock from Portfolio; 4. View Portfolio; 5. Calculate Portfolio Value; 6. Edit Portfolio Name; 7. Edit Stock Details; 8. Plot Portfolio Performance; 9. Visualize Total Portfolio Value Over Time; 0 to exit): 4
Option 4 selected.
Enter the portfolio name to view: abc
Portfolio Name: abc
Stocks in Portfolio:

Stock Symbol: NVDA
Company Name: Nvidia
Purchase Date: 2023-09-09
Purchase Price: $360.00
Current Price:  431.78
Quantity: 100

Stock Symbol: AAPL
Company Name: Apple
Purchase Date: 2023-10-02
Purchase Price: $180.00
Current Price:  172.25
Quantity: 150

Stock Symbol: AMZN
Company Name: Amazon
Purchase Date: 2023-09-17
Purchase Price: $240.00
Current Price:  128.17
Quantity: 200

Total Purchase Value: 111000.0
Total Current Value: $94649.66
Total Gain/Loss: $-16350.34
Percentage Gain/Loss: -14.72%

Welcome to Stock Portfolio Management System! Please select an option below:
1. Create Portfolio
2. Add Stock to Portfolio
3. Remove Stock from Portfolio
4. View Portfolio
5. Calculate Portfolio Value
6. Edit Portfolio Name
7. Edit Stock Details
8. Plot Portfolio Performance
9. Visualize Total Portfolio Value Over Time
0. Exit
Please select an option (1. Create Portfolio; 2. Add Stock to Portfolio; 3. Remove Stock from Portfolio; 4. View Portfolio; 5. Calculate Portfolio Value; 6. Edit Portfolio Name; 7. Edit Stock Details; 8. Plot Portfolio Performance; 9. Visualize Total Portfolio Value Over Time; 0 to exit): 8
Option 8 selected.
Enter the portfolio name to plot performance: abc
Welcome to Stock Portfolio Management System! Please select an option below:
1. Create Portfolio
2. Add Stock to Portfolio
3. Remove Stock from Portfolio
4. View Portfolio
5. Calculate Portfolio Value
6. Edit Portfolio Name
7. Edit Stock Details
8. Plot Portfolio Performance
9. Visualize Total Portfolio Value Over Time
0. Exit
Please select an option (1. Create Portfolio; 2. Add Stock to Portfolio; 3. Remove Stock from Portfolio; 4. View Portfolio; 5. Calculate Portfolio Value; 6. Edit Portfolio Name; 7. Edit Stock Details; 8. Plot Portfolio Performance; 9. Visualize Total Portfolio Value Over Time; 0 to exit): 9
Option 9 selected.
Enter the portfolio name to plot performance: abc
Enter the time scale (1w, 1mo, 1y): 1w
The visualization function returned None.

Welcome to Stock Portfolio Management System! Please select an option below:
1. Create Portfolio
2. Add Stock to Portfolio
3. Remove Stock from Portfolio
4. View Portfolio
5. Calculate Portfolio Value
6. Edit Portfolio Name
7. Edit Stock Details
8. Plot Portfolio Performance
9. Visualize Total Portfolio Value Over Time
0. Exit
Please select an option (1. Create Portfolio; 2. Add Stock to Portfolio; 3. Remove Stock from Portfolio; 4. View Portfolio; 5. Calculate Portfolio Value; 6. Edit Portfolio Name; 7. Edit Stock Details; 8. Plot Portfolio Performance; 9. Visualize Total Portfolio Value Over Time; 0 to exit): 0
Option 0 selected.
Exiting the management program. Thank you!
In [229]:
# User Login System for future work
# class User:
#     def __init__(self, username, password):
#         self.username = username
#         self.password = password
#
#     def is_authenticated(self, input_password):
#         return self.password == input_password
#
# class PortfolioManager:
#     def __init__(self):
#         self.user_data = {}  # Initialize user data as an empty dictionary
#         self.user_file = "user_data.json"  # File to store user data
#         self.load_user_data()  # Load user data from the file at the start
#
#     def create_user(self, username, password):
#         if username in self.user_data:
#             print("User already exists.")
#         else:
#             self.user_data[username] = {"password": password, "portfolios": []}
#             self.save_user_data()  # Save user data after creating a new user
#             print(f"User {username} created successfully.")
#
#     def login(self, username, password):
#         user = self.user_data.get(username)
#         if user:
#             if user["password"] == password:
#                 return True  # Valid username and password
#             else:
#                 print("Invalid password.")
#         else:
#             print("Invalid username or user not found.")
#         return False  # Login unsuccessful
#
#     def save_user_data(self):
#         user_data_to_save = self.user_data
#         for username, data in user_data_to_save.items():
#         # Serialize the portfolios and stocks to a JSON-friendly format
#             data["portfolios"] = [portfolio.__dict__ for portfolio in data["portfolios"]]
#             for portfolio_data in data["portfolios"]:
#                 portfolio_data["stocks"] = [stock.__dict__ for stock in portfolio_data["stocks"]]
#
#         with open(self.user_file, 'w') as file:
#             json.dump(user_data_to_save, file, indent=4)
#
#     def load_user_data(self):
#         try:
#             with open(self.user_file, 'r') as file:
#                 self.user_data = json.load(file)
#         except FileNotFoundError:
#             # Handle the case where the user data file doesn't exist yet
#             pass
In [ ]:
# Portfolio Manager linking with User Login
# def main():
#     portfolio_manager = PortfolioManager()
#     portfolio_manager.load_user_data()  # Load user accounts from the file
#
#     while True:
#         print("\nWelcome to Stock Portfolio Management Login System! Please select an option below:")
#         print("1. Create New User")
#         print("2. Login")
#         print("0. Exit")
#
#         choice = input("Welcome to Stock Portfolio Management Login System. Select an option: 1. Create New User; 2. Login; 0. Exit")
#         print(f"Option {choice} selected.")
#
#         if choice == '1':
#             username = input("Create a username: ")
#             password = input("Create a password: ")
#             portfolio_manager.create_user(username, password)
#         elif choice == '2':
#             username = input("Enter your username: ")
#             password = input("Enter your password: ")
#             if portfolio_manager.login(username, password):
#                 print("Login successful.")
#                 portfolio_management(username, portfolio_manager)  # Pass username and portfolio manager
#             else:
#                 print("Invalid username or password.")
#         elif choice == '0':
#             print(f"Exiting the login system. Thank you!")
#             break
#         else:
#             print("Invalid choice. Please select a valid option.")
#
# def portfolio_management(username, portfolio_manager):
#
#     while True:
#         print("\nWelcome to your account! Please select an option below:")
#         print("1. Create Portfolio")
#         print("2. Add Stock to Portfolio")
#         print("3. Remove Stock from Portfolio")
#         print("4. View Portfolio")
#         print("5. Calculate Portfolio Value")
#         print("0. Exit")
#
#         choice = input("Welcome to your account! Please select an option (1. Create Portfolio; 2. Add Stock to Portfolio; 3. Remove Stock from Portfolio; 4. View Portfolio; 5. Calculate Portfolio Value; 0 to exit): ")
#         print(f"Option {choice} selected.")
#
#         if choice == '1':
#         # Create a portfolio
#             name = input("Enter the portfolio name you would like to create: ")
#             new_portfolio = Portfolio(name)
#             portfolio_manager.user_data[username]["portfolios"].append(new_portfolio)
#             portfolio_manager.save_user_data()  # Save user data after creating a portfolio
#             print(f"Portfolio '{name}' created.")
#             continue
#         elif choice == '2':
#             # Add stock to portfolio
#             name = input("Enter the portfolio name to add stock: ")
#             portfolio = next((p for p in portfolio_manager.user_data[username]["portfolios"] if p.name == name), None)
#             if portfolio:
#                 # Add stock to the selected portfolio
#                 stock = Stock(symbol, company_name, purchase_date, purchase_price, quantity)
#                 portfolio.add_stock(stock)
#                 portfolio_manager.save_user_data()  # Save user data after adding a stock
#                 print(f"Stock added to the portfolio '{name}'.")
#             else:
#                 print(f"Portfolio '{name}' not found.")
#         elif choice == '3':
#             # Remove stock from portfolio
#             name = input("Enter the portfolio name to remove stock: ")
#             portfolio = next((p for p in portfolio_manager.user_data[username]["portfolios"] if p.name == name), None)
#             if portfolio:
#                 symbol = input("Enter stock symbol to remove: ")
#                 portfolio.remove_stock(symbol)
#                 portfolio_manager.save_user_data()  # Save user data after removing a stock
#                 print(f"Stock '{symbol}' removed from the portfolio '{name}'.")
#             else:
#                 print(f"Portfolio '{name}' not found.")
#         elif choice == '4':
#             # View portfolio
#             name = input("Enter the portfolio name to view: ")
#             portfolio = next((p for p in portfolio_manager.user_data[username]["portfolios"] if p.name == name), None)
#             if portfolio:
#                 portfolio.view_portfolio()
#             else:
#                 print(f"Portfolio '{name}' not found.")
#         elif choice == '5':
#             # Calculate portfolio value
#             name = input("Enter the portfolio name: ")
#             portfolio = next((p for p in portfolio_manager.user_data[username]["portfolios"] if p.name == name), None)
#             if portfolio:
#                 portfolio_value = portfolio.calculate_portfolio_value()
#                 print(f"Total value of '{name}' portfolio: ${portfolio_value:.2f}")
#             else:
#                 print(f"Portfolio '{name}' not found.")
#         elif choice == '0':
#             print(f"Exiting the management program. Thank you!")
#             break
#         else:
#             print("Invalid choice. Please select a valid option.")
#
# if __name__ == "__main__":
#     main()